package com.kele.util;

public class ModbusCRC16Util {
    // 计算CRC16校验码
    public static int calculateCRC16(byte[] data) {
        int crc = 0xFFFF; // 初始值
        int polynomial = 0xA001; // 多项式
        int i, j;

        for (i = 0; i < data.length; i++) {
            crc ^= ((int) data[i] & 0xFF); // 将当前字节与CRC的低8位进行异或
            for (j = 0; j < 8; j++) { // 对每一位进行处理
                if ((crc & 0x0001) != 0) { // 如果最低位为1
                    crc = (crc >>> 1) ^ polynomial; // 右移一位并进行异或
                } else {
                    crc >>>= 1; // 如果最低位为0，只右移一位
                }
            }
        }

        // 交换高低位
        crc = (crc & 0xFF) << 8 | (crc >> 8) & 0xFF;

        return crc;
    }
}
